package org.example;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 习题类：表示一套习题（包含多个算式）
 */
public class ExercisePaper {
    // 习题的标题
    private final String title;
    // 习题包含的所有算式（用List存储）
    private final List<ArithmeticExpression> expressions;

    /**
     * 构造方法：初始化一套习题
     * @param title 习题标题
     */
    public ExercisePaper(String title) {
        this.title = title;
        this.expressions = new ArrayList<>();
    }

    /**
     * 向习题中添加一个算式
     * @param exp 要添加的算式对象
     */
    public void addExpression(ArithmeticExpression exp) {
        this.expressions.add(exp);
    }

    /**
     * 获取习题中的所有算式
     */
    public List<ArithmeticExpression> getAllExpressions() {
        // 返回新的ArrayList，避免外部修改内部集合（封装性）
        return new ArrayList<>(this.expressions);
    }

    /**
     * 计算用户答题的正确率
     * @param answers 用户的答案（key是算式对象，value是用户输入的答案）
     * @return 正确率（0~1之间的小数）
     */
    public double calculateAccuracy(Map<ArithmeticExpression, Double> answers) {
        if (expressions.isEmpty()) {
            return 0.0;
        }
        int correctCount = 0;
        for (ArithmeticExpression exp : expressions) {
            Double userAnswer = answers.get(exp);
            // 若用户未答该题，视为错误
            if (userAnswer != null && exp.checkAnswer(userAnswer)) {
                correctCount++;
            }
        }
        // 计算正确率（保留2位小数）
        return Math.round(((double) correctCount / expressions.size()) * 100.0) / 100.0;
    }

    /**
     * 打印整个习题（包含标题和所有算式）
     */
    public void printExercise() {
        System.out.println("=====" + this.title + "=====");
        for (int i = 0; i < expressions.size(); i++) {
            System.out.println((i + 1) + ". " + expressions.get(i).getExpressionStr() + " = ");
        }
    }
}